package miage.ecom.commandes;


import java.io.PrintStream;
import java.util.List;
import java.util.StringTokenizer;
import miage.beans.MagasinPresentation;
import miage.beans.ProduitPresentation;
import miage.ecom.Main.Shell;
import miage.ecom.Shell.ShellConstantes.RESULT_ACTION;
import miage.ecom.Shell.ShellContext;
import miage.ecom.exceptions.BadFormateException;
import miage.ecom.exceptions.NumberAttributeException;
import miage.sessions.ecom.remote.EcomAdminRemote;
import miage.sessions.ecom.remote.EcomCustomerRemote;

    



public class ProductCommand implements ShellCommand{
    private ShellContext _context = null;
    StringBuffer res = new StringBuffer();

    
    public ProductCommand(ShellContext context)
    {
    _context = context;
    }
 
    
    @Override
    public String getName()
    {
    String langue = (String) _context.getVar(Shell.LANGUAGE);
    if(langue.equals("fr")){
   
    return "produit";}
    else if(langue.equals("es")){
    return "producto";}
    else if(langue.equals("it")){
    return "prodotto";}
    else{
    //default anglais
    return "product";
    }
    }
    
    
    @Override
    public String getUsage()
    {
    String langue = (String) _context.getVar(Shell.LANGUAGE);
    if(langue.equals("fr")){
   
    return "produit";}
    else if(langue.equals("es")){
    return "producto";}
    else if(langue.equals("it")){
    return "prodotto";}
    else{
    //default anglais
    return "product";
    }
    }
  
    
    @Override
    public String getShortDescription()
    {
    StringBuilder description = new StringBuilder();
    String langue = (String) _context.getVar(Shell.LANGUAGE);
    if(langue.equals("fr")){
    
     
    description.append("Gestion des produits\n");
    description.append("\t -magasin [id du magasin] ...................................liste les produits du magasin\n");
    description.append("\t -nom [nom du produit] .......................................liste les produits\n");
    description.append("\t -prix [prix maximum] ........................................liste les produits de prix infĂŠrieur\n");
    description.append("\t -prix [prix minimum] [prix maximum]..........................liste les produits dans un intervalle de prix\n");
    description.append("\t -ajouter [ref_prod] [nom] [ref_store] [img] [descr] [categ] [quant] [prix].........ajoute un produit\n");
    description.append("\t -modifier [ref_prod] [nom] [ref_store] [img] [descr] [categ] [quant] [prix].........modifie un produit\n");
    description.append("\t -supprimer [ref_prod] .........................................supprime un produit\n");
    description.append("\t sans arguments ..............................................liste les produits\n");
    }
     if(langue.equals("es")){
    description.append("\nGestion de Productos\n");
    description.append("\t -almacenar [id del almacenar] ..............................lista de los productos de la tienda\n");
    description.append("\t -nombre [nombre del producto] ...............................lista de productos cuyo nombre se pasa como un parĂĄmetro \n");
    description.append("\t -precio [precio mĂĄximo] .....................................lista de precio de productos de menor\n");
    description.append("\t -precio [precio mĂ­nimo] [precio mĂĄximo]......................productos en una amplia lista de precios\n");
    description.append("\t sin argumentos ..............................................productos de la lista\n");
    }
     if(langue.equals("it")){
    description.append("\nGestione prodotti\n");
    description.append("\t -memorizzare [id de memorizzare] ............................elenco dei prodotti negozio\n");
    description.append("\t -nome [nome del prodotto] ...................................elenco dei prodotti il cui nome viene passato come parametro \n");
    description.append("\t -prezzo [prezzo massimo] ....................................elenco dei prezzi dei prodotti inferiore\n");
    description.append("\t -prezzo [prezzo minimo] [prezzo massimo].....................prodotti in una gamma di prezzo di listino\n");
    description.append("\t senza argomenti .............................................lista prodotti\n");
    }
    if(langue.equals("en")){
    //default anglais
    description.append("\nProduct Management\n");
    description.append("\t -store [id store] ..........................................list of store products\n");
    description.append("\t -name [product name] ........................................list of products whose name is passed as a parameter. \n");
    description.append("\t -price [maximum price] ......................................list of products lower price\n");
    description.append("\t -price [minimum price] [maximum price] ......................products in a list price range\n");
    description.append("\t without arguments ...........................................list products\n");
    }
    return description.toString();
    }

    
    
    
    @Override
    public void execute(String cmdline, PrintStream out, PrintStream err) throws Exception
    {
    EcomCustomerRemote ecomCustomer = (EcomCustomerRemote) _context.getVar("customerEJB");
    EcomAdminRemote ecomAdmin = (EcomAdminRemote) _context.getVar("adminEJB");
    List<ProduitPresentation> products;
    MagasinPresentation magasin;
    ProduitPresentation produit;
    StringTokenizer st = new StringTokenizer(cmdline, " ");
    // Ignore cmd
    st.nextToken();
    if(st.countTokens()==0){
    products = ecomCustomer.getAllProduitByName("");
    out.println(getShortDescription());
    out.println(getFormateList(products));
    
    }else{
    String cmd = st.nextToken();
    if("-store".equals(cmd)||"-magasin".equals(cmd)||"-almacenar".equals(cmd)||"-memorizzare".equals(cmd)){
    if(st.countTokens()==1){
    String idStore=st.nextToken();
    products = ecomCustomer.getAllProduitByMagasin(idStore);
    out.println(getFormateList(products));
    }else{
    throw new NumberAttributeException();
    }
    }else{
    if("-name".equals(cmd)||"-nom".equals(cmd)||"-nome".equals(cmd)||"-nombre".equals(cmd)){
    if(st.countTokens()==1){
    String name=st.nextToken();
    products = ecomCustomer.getAllProduitByName(name);
    out.println(getFormateList(products));
    }else{
    throw new NumberAttributeException();
    }
    }else{
    if("-price".equals(cmd)||"-prix".equals(cmd)||"-precio".equals(cmd)||"-prezzo".equals(cmd)){
    if(st.countTokens()==1){
    double price=Double.parseDouble(st.nextToken());
    //double dans la bd
    products = ecomCustomer.getAllProduitByPrix(price);
    out.println(getFormateList(products));
    }else if(st.countTokens()==2){
    double priceMin=Double.parseDouble(st.nextToken());
    double priceMax=Double.parseDouble(st.nextToken());
    //products = ecomCustomer.getAllProduitByPrix(priceMin, priceMax);
   // out.println(getFormateList(products));
    }else{
    throw new NumberAttributeException();
    }
    }
    else{
    if("-add".equals(cmd)||"-ajouter".equals(cmd)||"-anadir".equals(cmd)||"-aggiungere".equals(cmd)){
    if(st.countTokens()==8){
        //ref,nom,desc,categ,quant,prix
    String ref_prod=st.nextToken();
    String name=st.nextToken();
    String ref_store=st.nextToken();
    String img=st.nextToken();
    String desc=st.nextToken(); 
    String categ=st.nextToken();
    Integer quantite=Integer.parseInt(st.nextToken());
    Double price=Double.parseDouble(st.nextToken());
    
    
    produit = new ProduitPresentation();
    produit.setReference_produit(ref_prod);
    produit.setNom_produit(name);
    magasin = new MagasinPresentation();
    magasin.setReference_store(ref_store);
    produit.setImageProduit(img);
    produit.setDescriptionProduit(desc);
    produit.setCategorieProduit(categ);
    produit.setQuantite(quantite);
    produit.setPrix_produit(price);
    

    ecomAdmin.addProduit(magasin, produit);
    
    
    //out.println(getFormateList(products));
    }else{
    throw new NumberAttributeException();
    }
    }
    else{
    if("-update".equals(cmd)||"-modifier".equals(cmd)||"-anadir".equals(cmd)||"-aggiungere".equals(cmd)){
          
    if(st.countTokens()==8){
        //ref,nom,desc,categ,quant,prix
    String ref_prod=st.nextToken();
    String name=st.nextToken(); 
    String ref_store=st.nextToken();
    String img=st.nextToken();
    String desc=st.nextToken(); 
    String categ=st.nextToken();
    Integer quantite=Integer.parseInt(st.nextToken());
    Double price=Double.parseDouble(st.nextToken());
    
    
    
    produit = new ProduitPresentation();
    produit.setReference_produit(ref_prod);
    produit.setNom_produit(name);
    produit.setReference_store(ref_store);
    produit.setImageProduit(img);
    produit.setDescriptionProduit(desc);
    produit.setCategorieProduit(categ);
    produit.setQuantite(quantite);
    produit.setPrix_produit(price);
    
    
    
    
    
    
    
    ecomAdmin.updateProduit(produit);}
    
    
    //out.println(getFormateList(products));
    else{
    throw new NumberAttributeException();
    }
    }
    
    
    
    else{
    if("-delete".equals(cmd)||"-supprimer".equals(cmd)||"-quitar".equals(cmd)||"-rimuovere".equals(cmd)){
    if(st.countTokens()==1){
    String idProduit=st.nextToken();
    ecomAdmin.deleteProduit(idProduit);
    

    //products = ecomCustomer.getProductByPrice(0, price);
    //out.println(getFormateList(products));
    }else{
    throw new NumberAttributeException();
    }
    }
    
    
    
    else{
    throw new BadFormateException();
    }
    
        
    }
    }
    }
    }
    }
    }
    }
    

 
    
    
    public String getFormateList(List<ProduitPresentation> listProducts){
    String output = (String) _context.getVar(Shell.OUTPUT);
    String langue = (String) _context.getVar(Shell.LANGUAGE);
    String currency = (String) _context.getVar(Shell.CURRENCY);
    EcomCustomerRemote ecomCustomer = (EcomCustomerRemote) _context.getVar("customerEJB");
    StringBuilder sb=new StringBuilder();
     if(output.equals("TEXT")){ 
   
     if(langue.equals("fr")){
    
    sb.append("liste des produits : \n");
    for (ProduitPresentation product : listProducts) {
    //product.setPrice(ecomCustomer.convertToEuro(product.getPrice(), currency));
    sb.append(getFormateProduct(product));}
     }
     if(langue.equals("es")){
    sb.append("lista de productos : \n");
    for (ProduitPresentation product : listProducts) {
    //product.setPrice(ecomCustomer.convertToEuro(product.getPrice(), currency));
    sb.append(getFormateProduct(product));}
     }
     if(langue.equals("it")){
    sb.append("elenco dei prodotti : \n");
    for (ProduitPresentation product : listProducts) {
    //product.setPrice(ecomCustomer.convertToEuro(product.getPrice(), currency));
    sb.append(getFormateProduct(product));}
     }
     if(langue.equals("en")){
    //default anglais
    sb.append("list of products : \n");
    
    for (ProduitPresentation product : listProducts) {
    //product.setPrice(ecomCustomer.convertToEuro(product.getPrice(), currency));
    sb.append(getFormateProduct(product));}
    }}
    if(output.equals("XML")){
        
    if(langue.equals("fr")){
    sb.append("<produits>\n");
    for (ProduitPresentation product : listProducts) {
    //product.setPrice(ecomCustomer.convertFromEuro(product.getPrice(), currency));
    sb.append(getFormateProduct(product));
    }
    sb.append("</produits>\n");}
    
    if(langue.equals("es")){
    sb.append("<productos>\n");
    for (ProduitPresentation product : listProducts) {
    //product.setPrice(ecomCustomer.convertFromEuro(product.getPrice(), currency));
    sb.append(getFormateProduct(product));
    }
    sb.append("</productos>\n");}
    
    if(langue.equals("it")){
    sb.append("<prodotti>\n");
    for (ProduitPresentation product : listProducts) {
   // product.setPrice(ecomCustomer.convertFromEuro(product.getPrice(), currency));
    sb.append(getFormateProduct(product));
    }
    sb.append("</prodotti>\n");}
    if(langue.equals("en")){
    //default anglais
    sb.append("<products>\n");
    for (ProduitPresentation product : listProducts) {
    //product.setPrice(ecomCustomer.convertFromEuro(product.getPrice(), currency));
    sb.append(getFormateProduct(product));
    }
    sb.append("</products>\n");
    }}
    if(output.equals("JSON")){
        
    if(langue.equals("fr")){
    sb.append("produits:{\n");
    for (ProduitPresentation product : listProducts) {
    //product.setPrice(ecomCustomer.convertFromEuro(product.getPrice(), currency));
    sb.append(getFormateProduct(product));
    }
    sb.append("}\n");}
    
    if(langue.equals("es")){
    sb.append("productos:{\n");
    for (ProduitPresentation product : listProducts) {
    //product.setPrice(ecomCustomer.convertFromEuro(product.getPrice(), currency));
    sb.append(getFormateProduct(product));
    }
    sb.append("}\n");}
    
    if(langue.equals("it")){
    sb.append("prodotti:{\n");
    for (ProduitPresentation product : listProducts) {
    //product.setPrice(ecomCustomer.convertFromEuro(product.getPrice(), currency));
    sb.append(getFormateProduct(product));
    }
    sb.append("}\n");}
    
   
    
    }return sb.toString();
    }
  
    
    
    public String getFormateProduct(ProduitPresentation product){
    String output = (String) _context.getVar(Shell.OUTPUT);
    String langue = (String) _context.getVar(Shell.LANGUAGE);
    StringBuilder sb=new StringBuilder();
    if(output.equals("TEXT")){
    sb.append(product.getReference_produit()+" - "+product.getNom_produit()+" - "+product.getCategorieProduit()+" - "+product.getPrix_produit()+" - "+product.getReference_store()+" - "+product.getDescriptionProduit()+"\n");
    return sb.toString();}
    
    if(output.equals("XML")){
    
       if(langue.equals("fr")){
    sb.append("\t<produit>\n");
    sb.append("\t\t<id>"+product.getReference_produit()+"</id>\n");
    sb.append("\t\t<nom>"+product.getNom_produit()+"</nom>\n");
    sb.append("\t\t<categorie>"+product.getCategorieProduit()+"</categorie>\n");
    sb.append("\t\t<prix>"+product.getPrix_produit()+"</prix>\n");
    sb.append("\t\t<id_magasin>"+product.getReference_store()+"</id_magasin>\n");
    sb.append("\t<produit>\n");}
    
       if(langue.equals("es")){
    sb.append("\t<producto>\n");
    sb.append("\t\t<id>"+product.getReference_produit()+"</id>\n");
    sb.append("\t\t<nombre>"+product.getNom_produit()+"</nombre>\n");
    sb.append("\t\t<categoria>"+product.getCategorieProduit()+"</categoria>\n");
    sb.append("\t\t<precio>"+product.getPrix_produit()+"</precio>\n");
    sb.append("\t\t<id_almacenar>"+product.getReference_store()+"</id_almacenar>\n");
    sb.append("\t<producto>\n");}
    
       if(langue.equals("it")){
    sb.append("\t<prodotto>\n");
    sb.append("\t\t<id>"+product.getReference_produit()+"</id>\n");
    sb.append("\t\t<nome>"+product.getNom_produit()+"</nome>\n");
    sb.append("\t\t<categoria>"+product.getCategorieProduit()+"</categoria>\n");
    sb.append("\t\t<prezzo>"+product.getPrix_produit()+"</prezzo>\n");
    sb.append("\t\t<id_memorizzare>"+product.getReference_store()+"</id_memorizzare>\n");
    sb.append("\t<prodotto>\n");}
    
       if(langue.equals("en")){
    //default anglais
    sb.append("\t<product>\n");
    sb.append("\t\t<id>"+product.getReference_produit()+"</id>\n");
    sb.append("\t\t<name>"+product.getNom_produit()+"</name>\n");
    sb.append("\t\t<category>"+product.getCategorieProduit()+"</category>\n");
    sb.append("\t\t<price>"+product.getPrix_produit()+"</price>\n");
    sb.append("\t\t<id_store>"+product.getReference_store()+"</id_store>\n");
    sb.append("\t<product>\n");}
    }
    
    
    
    return sb.toString();
    }
    } 